package com.read.scriptures.db;

import android.content.Context;
import android.content.ContextWrapper;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

import com.read.scriptures.app.HuDongApplication;
import com.read.scriptures.util.LogUtil;
import com.read.scriptures.util.StringUtil;

import java.io.File;
import java.io.IOException;

public class DatabaseContext extends ContextWrapper {

    private Context mContext;
    private String dirName;
    private String sdCardPath;

    public Context getmContext() {
        return mContext;
    }

    public void setmContext(Context mContext) {
        this.mContext = mContext;
    }

    public String getDirName() {
        return dirName;
    }

    public void setDirName(String dirName) {
        this.dirName = dirName;
    }

    public String getSdCardPath() {
        return sdCardPath;
    }

    public void setSdCardPath(String sdCardPath) {
        this.sdCardPath = sdCardPath;
    }

    /**
     * 构造函数
     * 
     * @param base 上下文环境
     */
    public DatabaseContext(Context base) {
        super(base);
        this.mContext = base;
    }

    /**
     * 构造函数
     * 
     * @param base
     * @param dirName
     */
    public DatabaseContext(Context base, String dirName) {
        super(base);
        this.mContext = base;
        this.dirName = dirName;
        this.sdCardPath = HuDongApplication.getInstance().getDBDir();
    }

    /**
     * 获得数据库路径，如果不存在，则创建对象对象
     * 
     * @param name
     * @param mode
     * @param factory
     */
    @Override
    public File getDatabasePath(String name) {
        if (!StringUtil.isEmpty(sdCardPath)) {
            File dirFile = new File(sdCardPath);
            if (!dirFile.exists()) {
                dirFile.mkdirs();
            }
            // 数据库文件是否创建成功
            boolean isFileCreateSuccess = false;
            // 判断文件是否存在，不存在则创建该文件
            File dbFile = new File(sdCardPath + "/" + name);
            LogUtil.test(dbFile.getAbsolutePath());
            if (!dbFile.exists()) {
                try {
                    isFileCreateSuccess = dbFile.createNewFile();// 创建文件
                } catch (IOException e) {
                    LogUtil.error("IOException", e);
                }
            } else
                isFileCreateSuccess = true;

            // 返回数据库文件对象
            if (isFileCreateSuccess)
                return dbFile;
            else
                return null;
        }
        // 判断是否存在sd卡
        boolean sdExist = android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment.getExternalStorageState());
        if (!sdExist) {// 如果不存在,
            return null;
        } else {
            // 如果存在
            // 获取sd卡路径
            String dbDir = android.os.Environment.getExternalStorageDirectory().getAbsolutePath();
            dbDir += "/" + ((dirName == null || "".equals(dirName)) ? mContext.getPackageName() : dirName);// 数据库所在目录
            String dbPath = dbDir + "/" + name;// 数据库路径
            // 判断目录是否存在，不存在则创建该目录
            File dirFile = new File(dbDir);
            if (!dirFile.exists())
                dirFile.mkdirs();

            // 数据库文件是否创建成功
            boolean isFileCreateSuccess = false;
            // 判断文件是否存在，不存在则创建该文件
            File dbFile = new File(dbPath);
            if (!dbFile.exists()) {
                try {
                    isFileCreateSuccess = dbFile.createNewFile();// 创建文件
                } catch (IOException e) {
                    LogUtil.error("IOException", e);
                }
            } else
                isFileCreateSuccess = true;

            // 返回数据库文件对象
            if (isFileCreateSuccess)
                return dbFile;
            else
                return null;
        }
    }

    /**
     * 重载这个方法，是用来打开SD卡上的数据库的，android 2.3及以下会调用这个方法。
     * 
     * @param name
     * @param mode
     * @param factory
     */
    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory) {
        SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
        return result;
    }

    /**
     * Android 4.0会调用此方法获取数据库。
     * 
     * @see ContextWrapper#openOrCreateDatabase(String,
     *      int, CursorFactory,
     *      DatabaseErrorHandler)
     * @param name
     * @param mode
     * @param factory
     * @param errorHandler
     */
    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory,
            DatabaseErrorHandler errorHandler) {
        SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), null);
        return result;
    }
}
